#include<setjmp.h> int setjmp(env); jmp_buf env; переменная, в которой хранится окружение.
Описание.
Функция setjmp сохраняет состояние стека, который может быть последовательно восстановлен посредством использования функции longjmp .
Функции setjmp и longjmp обеспечивают возможность выполнения нелокального (nonlocal ) перехода и обычно используются для передачи управления к обработке ошибок для восстановления кода в ранее вызванной процедуре (без использования обычного вызова), для возврата условных обозначений. Вызов setjmp активизирует сох ранение текущего состояния стека в env . Последующий вызов longjmp восстанавливает сохраненное состояние и возвращает управление на указатель (точку входа), непосредственно следующий за соответствующим вызовом setjmp . Когда вызывается функция longjmp , значения всех переменных (за исключением переменных регистра) становятся доступными для процедуры, которая принимает управление и содержит значения этих переменных. Значения переменных регистра непредсказуемы.
Возвращаемое значение.
После сохранения состояния стека функция setjmp возвращает значение 0. Если в результате вызова longjmp возвращается setjmp , тогда возвращается и значение value аргумента longjmp . Возвращаемого значения в случае ошибки нет.
Замечание.
После выполнения longjmp значения переменных регистра в процедуре, вызывающей setjmp , не могут быть восстановлены (возвращены) к собственным значениям.
Пример:
#include <stdio.h>
#include <setjmp.h>
jmp_buf mark;
main()
{
if (setjmp(mark) != 0)
{ printf("longjmp has been called\n");
recover();
exit(1);
}
printf("setjmp has been called\n");
.
.
.
p();
.
.
.
}
p()
{
int error = 0;
.
.
.
if (error != 0)
longjmp(mark, -1);
.
.
.
}
recover()
{
/* при выходе из программы убедитесь, что файлы данных не
будут запорчены */
.
.
.
}